La diabetes es una enfermedad crónica que afecta a millones de personas en todo el mundo y que representa un desafío creciente para los sistemas de salud. Las complicaciones asociadas con la diabetes, como enfermedades cardiovasculares, nefropatías y neuropatías, pueden aumentar significativamente la necesidad de hospitalización. Además, diversos estudios han sugerido que factores ambientales, incluyendo las variaciones climáticas, podrían desempeñar un papel importante en la exacerbación de síntomas y el desarrollo de complicaciones en personas con diabetes.
A pesar de estos indicios, aún existe una considerable falta de conocimiento sobre cómo las condiciones climáticas específicas, como la temperatura, la humedad, o las precipitaciones, pueden influir en la salud de las personas diabéticas y en los patrones de hospitalización. En particular, no se ha explorado suficientemente si existen correlaciones consistentes entre variables climáticas y las tasas de hospitalización. Este vacío de conocimiento es especialmente relevante en el contexto de un clima cambiante que podría exacerbar estas tendencias.
Con este seminario, buscamos abordar estas lagunas mediante un enfoque interdisciplinario que integre datos climáticos históricos y registros de hospitalización para analizar posibles relaciones entre estas variables y aportar al entendimiento de los factores ambientales que afectan a las personas con diabetes.
Explorar y analizar la relación entre las hospitalizaciones por diabetes y las variaciones en las condiciones climáticas (como temperatura, humedad y precipitaciones), con el fin de identificar patrones y posibles correlaciones que contribuyan al conocimiento de los factores ambientales que influyen en esta enfermedad.
Analizar la relación entre las variables climáticas clave (temperatura máxima, mínima y media) y las tasas de hospitalizaciones y muertes por diabetes.
Identificar posibles correlaciones entre las variaciones climáticas y las tasas de hospitalización, explorando la fuerza y dirección de dichas relaciones.
Determinar si existen diferencias significativas en el impacto de las condiciones climáticas sobre las hospitalizaciones por diabetes en distintas regiones geográficas.
El artículo de Preston et al. (2020) realiza una revisión sistemática sobre la relación entre factores climáticos (temperatura ambiente, estacionalidad y humedad) y la diabetes gestacional (GDM) (Preston et al. 2020). Se identificaron 16 artículos que analizan estas asociaciones, mostrando evidencia consistente de un efecto estacional, con mayores tasas de GDM y niveles de glucosa más elevados durante el verano. También se encontró evidencia sugestiva de que temperaturas más altas podrían estar asociadas con niveles elevados de glucosa en embarazadas. A pesar de las inconsistencias metodológicas en los estudios, los resultados destacan la necesidad de investigaciones adicionales para comprender los mecanismos detrás de estas asociaciones.
El artículo de Moon (2021) analiza mediante un meta-análisis cómo las olas de calor afectan la morbilidad y mortalidad en pacientes con diabetes (Moon 2021). A partir de 36 estudios, se encontró que las olas de calor incrementan ligeramente los riesgos de mortalidad (18 %) y morbilidad (10 %) en esta población. También se identificaron factores importantes como los días de desfase (“lag days”) y la definición de ola de calor. Aunque el artículo no aborda directamente las hospitalizaciones, sus hallazgos son relevantes al explorar cómo los extremos climáticos pueden agravar las condiciones de salud en diabéticos, destacando la importancia de estrategias de salud pública para mitigar estos efectos.
A continuación se recogen todos los paquetes utilizados para el tratamiento de los detos de trabajo.
library(pxR)
library(climaemet)
library(dplyr)
library(stringr)
library(shiny)
library(ggplot2)
library(plotly)
library(tidyr)
library(mapSpain)
library(countrycode)
library(sf)
library(DT)
library(readr)
## Use this function to register your API Key temporarly or permanently
# aemet_api_key("eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJmcGFibG81NDVAZ21haWwuY29tIiwianRpIjoiYTI2NWIyNzQtY2M4OS00NWZmLThlNGYtMWJlYWQ2NTA1MTAxIiwiaXNzIjoiQUVNRVQiLCJpYXQiOjE3MjkzNTMxNTgsInVzZXJJZCI6ImEyNjViMjc0LWNjODktNDVmZi04ZTRmLTFiZWFkNjUwNTEwMSIsInJvbGUiOiIifQ.TGFw-QlkAkMyQ2hItIpbSF_xDIoN42JpIzUhf-dOm3A", install= TRUE)
Obtenemos los nombres de archivos con datos de diabetes
archivos <- list.files('INPUT/DATA/Diabetes/Ingresos/', pattern = '*.px')
Añadimos la ruta completa de cada archivo
archivos_pc <- sapply(archivos, function(x) paste0('INPUT/DATA/Diabetes/Ingresos/', x))
Creamos el dataframe base con el primer archivo, que servirá para concatenar los datos de años siguientes
df_i <- data.frame(as.data.frame(read.px(archivos_pc[1])))
df_i['Año'] <- 1997 # Añadir columna de año
Bucle para añadir cada año al dataframe
for (i in 2:length(archivos_pc)) {
# Cargar los datos del año específico
df_provisional <- data.frame(as.data.frame(read.px(archivos_pc[i])))
# Extraer el año del nombre del archivo
año <- unlist(strsplit(archivos[i], "\\."))[1]
año <- substr(año, nchar(año) - 3, nchar(año))
# Añadir columna de año al nuevo dataframe
df_provisional['Año'] <- año
# Asegurar que las columnas coincidan
colnames(df_provisional) <- colnames(df_i)
# Concatenar el dataframe con el del año anterior
df_i <- rbind(df_i, df_provisional)
}
Tras la carga de datos, el dataframe queda así:
Primero eliminamos el atributo ‘Diagnóstico’
df_i <- select(df_i,-Diagnóstico)
Si analizamos los distintos valores que toma el atributo ‘Provincia.de.hospitalización’ observamos que supera la suma de provincias (50), ciudades autónomas (2), comunidades autónomas no uniprovinciales (10) y país (1).
length(levels(df_i$Provincia.de.hospitalización))
## [1] 154
Limpiamos los nombres de las provincias: eliminamos números y ajustamos algunos nombres para normalización.
df_i$Provincia.de.hospitalización <- str_replace_all(df_i$Provincia.de.hospitalización,"[0123456789]","") %>%
str_replace_all("^ ","") %>%
str_replace_all("Araba/Á","A") %>%
str_replace_all("/Alacant", '') %>%
str_replace_all("ANDALUCÍA", 'Andalucía') %>%
str_replace_all('ARAGÓN', 'Aragón') %>%
str_replace_all('ASTURIAS','Asturias') %>%
str_replace_all('Asturias \\(Principado de\\)', 'Asturias') %>%
str_replace_all('Asturias, Principado de', 'Asturias') %>%
str_replace_all('Asturias, PRINCIPADO DE', 'Asturias') %>%
str_replace_all('Ávila', 'Avila') %>%
str_replace_all('BALEARS, ILLES', 'Baleares') %>%
str_replace_all('Balears, Illes', 'Baleares') %>%
str_replace_all('Balears \\(Illes\\)', 'Baleares') %>%
str_replace_all("CANARIAS", 'Canarias') %>%
str_replace_all("CANTABRIA", 'Cantabria') %>%
str_replace_all("Castellón de la Plana", 'Castellón') %>%
str_replace_all("/Castelló", '') %>%
str_replace_all("CASTILLA - LA MANCHA", 'Castilla - La Mancha') %>%
str_replace_all("CASTILLA Y LEÓN", 'Castilla y León') %>%
str_replace_all("CATALUÑA", 'Cataluña') %>%
str_replace_all("Comunitat Valenciana", 'Comunidad Valenciana') %>%
str_replace_all("COMUNITAT VALENCIANA", 'Comunidad Valenciana') %>%
str_replace_all("Coruña \\(A\\)", 'A Coruña') %>%
str_replace_all("Coruña, A", 'A Coruña') %>%
str_replace_all("EXTREMADURA", 'Extremadura') %>%
str_replace_all("GALICIA", 'Galicia') %>%
str_replace_all("Guipúzcoa", 'Gipuzkoa') %>%
str_replace_all('MADRID, COMUNIDAD DE','Madrid') %>%
str_replace_all('Madrid, Comunidad de', 'Madrid') %>%
str_replace_all('Madrid \\(Comunidad de\\)', 'Madrid') %>%
str_replace_all('MURCIA, REGIÓN DE','Murcia') %>%
str_replace_all('Murcia \\(Región de\\)','Murcia') %>%
str_replace_all('Murcia, Región de','Murcia') %>%
str_replace_all('Murcia*', 'Murcia') %>%
str_replace_all('NAVARRA, COMUNIDAD FORAL DE','Navarra') %>%
str_replace_all('Navarra \\(Comun. Foral de\\)', 'Navarra') %>%
str_replace_all('Navarra, Comunidad Foral de', 'Navarra') %>%
str_replace_all('PAÍS VASCO', 'País Vasco') %>%
str_replace_all("Palmas \\(Las\\)", 'Las Palmas') %>%
str_replace_all("Palmas, Las", 'Las Palmas') %>%
str_replace_all("Rioja \\(La\\)", 'La Rioja') %>%
str_replace_all("Rioja, La", 'La Rioja') %>%
str_replace_all("RIOJA, LA", 'La Rioja') %>%
str_replace_all("TOTAL NACIONAL", 'Total') %>%
str_replace_all("Total Nacional", 'Total') %>%
str_replace_all("/València", '') %>%
str_replace_all("Bizkaia", 'Vizcaya')
Comprobamos de nuevo el número de distintos valores en ‘Provincia.de.hospitalización’.
length(levels(factor(df_i$Provincia.de.hospitalización)))
## [1] 63
Se han registrado el sexo de los individuos masculinos como “Varón” o “Hombres”
levels(factor(df_i$Sexo))
## [1] "Varones" "Mujeres" "Ambos sexos" "Hombres"
Se modifica de tal manera de que solo se registren como “Hombres”
df_i$Sexo <- str_replace_all(df_i$Sexo,"Varones", 'Hombres')
levels(factor(df_i$Sexo))
## [1] "Ambos sexos" "Hombres" "Mujeres"
Se añade la información refenrente a la comunidad autónoma como un nuevo atributo y se eliminan los registros que aglutinan los datos de las comunidades no uniprovinciales y el total nacional.`
df_i<- df_i %>%
mutate(Comunidad.Autonoma = case_when(
Provincia.de.hospitalización %in% c("Almería","Cádiz","Córdoba","Granada","Huelva","Jaén","Málaga","Sevilla") ~ "Andalucía",
Provincia.de.hospitalización %in% c("Huesca","Teruel","Zaragoza") ~ "Aragón",
Provincia.de.hospitalización == "Baleares" ~ "Baleares",
Provincia.de.hospitalización == "Asturias" ~ "Asturias",
Provincia.de.hospitalización %in% c("Las Palmas","Santa Cruz de Tenerife") ~ "Canarias",
Provincia.de.hospitalización == "Cantabria" ~ "Cantabria",
Provincia.de.hospitalización %in% c("Avila","Burgos", "León", "Palencia", "Salamanca", "Segovia", "Soria", "Valladolid", "Zamora") ~ "Castilla y León",
Provincia.de.hospitalización %in% c("Albacete", "Ciudad Real", "Cuenca", "Guadalajara", "Toledo") ~ "Castilla - La Mancha",
Provincia.de.hospitalización %in% c("Barcelona", "Girona", "Lleida", "Tarragona") ~ "Cataluña",
Provincia.de.hospitalización %in% c("Alicante", "Castellón", "Valencia") ~ "Comunidad Valenciana",
Provincia.de.hospitalización %in% c("Badajoz", "Cáceres") ~ "Extremadura",
Provincia.de.hospitalización %in% c("A Coruña", "Lugo", "Ourense", "Pontevedra") ~ "Galicia",
Provincia.de.hospitalización == "Madrid" ~ "Madrid",
Provincia.de.hospitalización == "Murcia" ~ "Murcia",
Provincia.de.hospitalización == "Navarra" ~ "Navarra",
Provincia.de.hospitalización %in% c("Alava", "Gipuzkoa", "Vizcaya") ~ "País Vasco",
Provincia.de.hospitalización == "La Rioja" ~ "La Rioja",
Provincia.de.hospitalización == "Ceuta" ~ "Ceuta",
Provincia.de.hospitalización == "Melilla" ~ "Melilla"
)) %>%
filter(!grepl("^(Total|Andalucía|Aragón|Canarias|Castilla y León|Castilla - La Mancha|Cataluña|Comunidad Valenciana|Extremadura|Galicia|País Vasco)"
, Provincia.de.hospitalización))
df_i <- rename(.data = df_i, Provincia = Provincia.de.hospitalización, Diagnosticos = value)
datos_muertes <- read.px('INPUT/DATA/Diabetes/Muertes/muertes1997-2022.px')
df_m <- as.data.frame(datos_muertes)
Mostramos las primeras filas del dataframe para verificar la carga de datos.
Realizamos los mismos cambios que con los datos de muertes por diabetes.
df_m <- select(df_m,-Causa.de.muerte)
Estandarizamos los nombres de las provincias.
df_m$Provincias <- str_replace_all(df_m$Provincias,"[0123456789]","") %>%
str_replace_all("^ ","") %>%
str_replace_all("Araba/Á","A") %>%
str_replace_all("/Alacant", '') %>%
str_replace_all("ANDALUCÍA", 'Andalucía') %>%
str_replace_all('ARAGÓN', 'Aragón') %>%
str_replace_all('ASTURIAS','Asturias') %>%
str_replace_all('Asturias \\(Principado de\\)', 'Asturias') %>%
str_replace_all('Asturias, Principado de', 'Asturias') %>%
str_replace_all('Asturias, PRINCIPADO DE', 'Asturias') %>%
str_replace_all('Ávila', 'Avila') %>%
str_replace_all('BALEARS, ILLES', 'Baleares') %>%
str_replace_all('Balears, Illes', 'Baleares') %>%
str_replace_all('Balears \\(Illes\\)', 'Baleares') %>%
str_replace_all("CANARIAS", 'Canarias') %>%
str_replace_all("CANTABRIA", 'Cantabria') %>%
str_replace_all("Castellón de la Plana", 'Castellón') %>%
str_replace_all("/Castelló", '') %>%
str_replace_all("CASTILLA - LA MANCHA", 'Castilla - La Mancha') %>%
str_replace_all("CASTILLA Y LEÓN", 'Castilla y León') %>%
str_replace_all("CATALUÑA", 'Cataluña') %>%
str_replace_all("Comunitat Valenciana", 'Comunidad Valenciana') %>%
str_replace_all("COMUNITAT VALENCIANA", 'Comunidad Valenciana') %>%
str_replace_all("Coruña \\(A\\)", 'A Coruña') %>%
str_replace_all("Coruña, A", 'A Coruña') %>%
str_replace_all("EXTREMADURA", 'Extremadura') %>%
str_replace_all("GALICIA", 'Galicia') %>%
str_replace_all("Guipúzcoa", 'Gipuzkoa') %>%
str_replace_all('MADRID, COMUNIDAD DE','Madrid') %>%
str_replace_all('Madrid, Comunidad de', 'Madrid') %>%
str_replace_all('Madrid \\(Comunidad de\\)', 'Madrid') %>%
str_replace_all('MURCIA, REGIÓN DE','Murcia') %>%
str_replace_all('Murcia \\(Región de\\)','Murcia') %>%
str_replace_all('Murcia, Región de','Murcia') %>%
str_replace_all('Murcia*', 'Murcia') %>%
str_replace_all('NAVARRA, COMUNIDAD FORAL DE','Navarra') %>%
str_replace_all('Navarra \\(Comun. Foral de\\)', 'Navarra') %>%
str_replace_all('Navarra, Comunidad Foral de', 'Navarra') %>%
str_replace_all('PAÍS VASCO', 'País Vasco') %>%
str_replace_all("Palmas \\(Las\\)", 'Las Palmas') %>%
str_replace_all("Palmas, Las", 'Las Palmas') %>%
str_replace_all("Rioja \\(La\\)", 'La Rioja') %>%
str_replace_all("Rioja, La", 'La Rioja') %>%
str_replace_all("RIOJA, LA", 'La Rioja') %>%
str_replace_all("TOTAL NACIONAL", 'Total') %>%
str_replace_all("Total Nacional", 'Total') %>%
str_replace_all("/València", '') %>%
str_replace_all("Bizkaia", 'Vizcaya')
Se modifica el valor “Ambos sexos” por “Total” para que el atributo sexo comparta los mismos niveles en los dataframes de ingresos y muertes.
levels(factor(df_m$Sexo))
## [1] "Total" "Hombres" "Mujeres"
df_m$Sexo <- str_replace_all(df_m$Sexo,"Total","Ambos sexos")
levels(factor(df_m$Sexo))
## [1] "Ambos sexos" "Hombres" "Mujeres"
De igual manera que con los datos de ingresos, se añade la información referente a la comunidad autónoma como un nuevo atributo y se eliminan los registros que aglutinan los datos de las comunidades no uniprovinciales y el total nacional.
df_m <- df_m %>%
mutate(Comunidad.Autonoma = case_when(
Provincias %in% c("Almería","Cádiz","Córdoba","Granada","Huelva","Jaén","Málaga","Sevilla") ~ "Andalucía",
Provincias %in% c("Huesca","Teruel","Zaragoza") ~ "Aragón",
Provincias == "Baleares" ~ "Baleares",
Provincias == "Asturias" ~ "Asturias",
Provincias %in% c("Las Palmas","Santa Cruz de Tenerife") ~ "Canarias",
Provincias == "Cantabria" ~ "Cantabria",
Provincias %in% c("Avila","Burgos", "León", "Palencia", "Salamanca", "Segovia", "Soria", "Valladolid", "Zamora") ~ "Castilla y León",
Provincias %in% c("Albacete", "Ciudad Real", "Cuenca", "Guadalajara", "Toledo") ~ "Castilla - La Mancha",
Provincias %in% c("Barcelona", "Girona", "Lleida", "Tarragona") ~ "Cataluña",
Provincias %in% c("Alicante", "Castellón", "Valencia") ~ "Comunidad Valenciana",
Provincias %in% c("Badajoz", "Cáceres") ~ "Extremadura",
Provincias %in% c("A Coruña", "Lugo", "Ourense", "Pontevedra") ~ "Galicia",
Provincias == "Madrid" ~ "Madrid",
Provincias == "Murcia" ~ "Murcia",
Provincias == "Navarra" ~ "Navarra",
Provincias %in% c("Alava", "Gipuzkoa", "Vizcaya") ~ "País Vasco",
Provincias == "La Rioja" ~ "La Rioja",
Provincias == "Ceuta" ~ "Ceuta",
Provincias == "Melilla" ~ "Melilla"
)) %>%
filter(!grepl("^(Extranjero|Nacional|Total|Andalucía|Aragón|Canarias|Castilla y León|Castilla - La Mancha|Cataluña|Comunidad Valenciana|Extremadura|Galicia|País Vasco)"
, Provincias))
df_m<-rename(.data = df_m, Provincia = Provincias, Muertes = value, Año = Periodo)
Se recogen todas las estaciones de la aemet.
estaciones <- aemet_stations()
A continuación, se muestra la estructura de los datos:
Selección de los códigos de las estaciones meteorológicas de interés.
codigos <- c("C449C", "C658L", "0076", "0367", "1212E", "1387", "1484C", "1505", "1690A", "2030", "2331", "2422", "2465", "2614", "2870", "3129", "3013", "3260B", "4121", "4452", "4642E", "5000C", "5530E", "5783", "6000A", "7178I", "8025", "8096", "8178D", "8368U", "8414A", "9434", "9771C", "9898", "6325O", "9091O", "2444", "B278", "1082", "3469A", "5973", "1111", "8500A", "5402", "1014", "5270B", "9170", "6155A", "9263D", "0016A", "2661", "2235U")
Generación del dataframe Datos_metdonde se almacenarán
los datos.
datos_met <- data.frame(matrix(ncol = 5))
colnames(datos_met) <- c('codigo', 'ta_max', 'ta_min', 'tm_mes', 'año')
Obtención de los datos de tempertatura máxima, mínima y media mesual durante los años 2003 a 2020 de todas las estaciones selecionadas.
A continuación, se muestra el código para acceder a dichos datos de la AEMET. Para una mayor rapidez de renderizado se importan los datos desde un archivo.
for (año in 2003:2020){
print(año)
for (i in codigos){
print(i)
met_prov <- as.data.frame(aemet_monthly_clim(i, year = año)) %>%
slice (1:12) %>%
select(c('ta_max', 'ta_min', 'tm_mes'))
met_prov$ta_max <- sapply(met_prov$ta_max, FUN = function(x) as.numeric(unlist(strsplit(x, '\\('))[1]) )
met_prov$ta_min <- sapply(met_prov$ta_min, FUN = function(x) as.numeric(unlist(strsplit(x, '\\('))[1]) )
met_procesados <- data.frame('codigo' = i,
'ta_max' = max(met_prov$ta_max, na.rm = TRUE),
'ta_min' = min(met_prov$ta_min, na.rm = TRUE),
'tm_mes' = mean(met_prov$tm_mes, na.rm = TRUE),
'año' = año)
# print(met_procesados)
datos_met <- rbind(datos_met, met_procesados)
# print(datos_met)
Sys.sleep(1.5)
}
}
load('datos_aemet.RData')
Añadimos la provincia correspondiente a cada registro.
cod_estaciones <- estaciones %>%
select(indicativo,provincia) %>%
rename(codigo = indicativo)
datos_met <- merge(datos_met,cod_estaciones, by = 'codigo')
Estandarizamos los nombres de los atributos y de las provincias. Eliminamos el atributo ‘codigo’
datos_met<-rename(.data = datos_met, Provincia = provincia, Año = año)
datos_met <- select(datos_met,-codigo)
datos_met$Año <- as.character(datos_met$Año)
datos_met$Provincia <- str_replace_all(datos_met$Provincia,"TARRAGONA","Tarragona") %>%
str_replace_all("BARCELONA", "Barcelona") %>%
str_replace_all("GIRONA", "Girona") %>%
str_replace_all("GIPUZKOA", "Gipuzkoa") %>%
str_replace_all("BIZKAIA", "Vizcaya") %>%
str_replace_all("CANTABRIA", 'Cantabria') %>%
str_replace_all('ASTURIAS','Asturias') %>%
str_replace_all("A CORUÑA", "A Coruña") %>%
str_replace_all("PONTEVEDRA", "Pontevedra") %>%
str_replace_all("LUGO", "Lugo") %>%
str_replace_all("OURENSE", "Ourense") %>%
str_replace_all("SORIA", "Soria") %>%
str_replace_all("PALENCIA", "Palencia") %>%
str_replace_all("BURGOS", "Burgos") %>%
str_replace_all("VALLADOLID", "Valladolid") %>%
str_replace_all("AVILA", "Avila") %>%
str_replace_all("SEGOVIA", "Segovia") %>%
str_replace_all("ZAMORA", "Zamora") %>%
str_replace_all("LEON", "León") %>%
str_replace_all("SALAMANCA", "Salamanca") %>%
str_replace_all("GUADALAJARA", "Guadalajara") %>%
str_replace_all("MADRID", "Madrid") %>%
str_replace_all("TOLEDO", "Toledo") %>%
str_replace_all("CACERES", "Cáceres") %>%
str_replace_all("CIUDAD REAL", "Ciudad Real") %>%
str_replace_all("BADAJOZ", "Badajoz") %>%
str_replace_all("HUELVA", "Huelva") %>%
str_replace_all("CEUTA", "Ceuta") %>%
str_replace_all("JAEN", "Jaén") %>%
str_replace_all("CORDOBA", "Córdoba") %>%
str_replace_all("GRANADA", "Granada") %>%
str_replace_all("SEVILLA", "Sevilla") %>%
str_replace_all("CADIZ", "Cádiz") %>%
str_replace_all("MELILLA", "Melilla") %>%
str_replace_all("MALAGA", "Málaga") %>%
str_replace_all("ALMERIA", "Almería") %>%
str_replace_all("MURCIA", "Murcia") %>%
str_replace_all("ALICANTE", "Alicante") %>%
str_replace_all("CUENCA", "Cuenca") %>%
str_replace_all("ALBACETE", "Albacete") %>%
str_replace_all("TERUEL", "Teruel") %>%
str_replace_all("VALENCIA", "Valencia") %>%
str_replace_all("CASTELLON", "Castellón") %>%
str_replace_all("ARABA/ALAVA", "Alava") %>%
str_replace_all("LA RIOJA", "La Rioja") %>%
str_replace_all("NAVARRA", "Navarra") %>%
str_replace_all("ZARAGOZA", "Zaragoza") %>%
str_replace_all("LLEIDA", "Lleida") %>%
str_replace_all("HUESCA", "Huesca") %>%
str_replace_all("ILLES BALEARS", "Baleares") %>%
str_replace_all("STA. CRUZ DE TENERIFE", "Santa Cruz de Tenerife") %>%
str_replace_all("LAS PALMAS", "Las Palmas")
Para un mejor análisis de los resultados finales se obtienen las poblaciones anuales de cada provincia.
Poblacion <- read_delim("INPUT/DATA/Poblacion/Poblacion.csv",
delim = ";",locale = locale(encoding = "ISO-8859-1"), ,escape_double = FALSE, trim_ws = TRUE) %>%
select(!(Edad)) %>%
filter(grepl('enero', Periodo)) %>%
suppressMessages()
Inicialmente Población se estructura así:
Poblacion$Provincias <- str_replace_all(Poblacion$Provincias,"[0123456789]","") %>%
str_replace_all("^ ","") %>%
str_replace_all("Araba/Á","A") %>%
str_replace_all("/Alacant", '') %>%
str_replace_all('Ávila', 'Avila') %>%
str_replace_all('Balears, Illes', 'Baleares') %>%
str_replace_all("CANARIAS", 'Canarias') %>%
str_replace_all("CANTABRIA", 'Cantabria') %>%
str_replace_all("/Castelló", '') %>%
str_replace_all("Coruña, A", 'A Coruña') %>%
str_replace_all("Guipúzcoa", 'Gipuzkoa') %>%
str_replace_all('Murcia*', 'Murcia') %>%
str_replace_all("Palmas, Las", 'Las Palmas') %>%
str_replace_all("Rioja, La", 'La Rioja') %>%
str_replace_all("/València", '') %>%
str_replace_all("Bizkaia", 'Vizcaya')
Poblacion$Periodo <- substr(Poblacion$Periodo,nchar(Poblacion$Periodo)-4,nchar(Poblacion$Periodo)) %>%
as.integer()
Nos quedamos con la parte entera del valor referente a población y lo guardamos como número.
Poblacion$Total <- sapply(sapply(Poblacion$Total, strsplit, split = ','), function(x) x[1])
Poblacion$Total <- Poblacion$Total %>%
str_replace_all("\\.","") %>%
as.integer()
Poblacion <- rename(.data = Poblacion, Provincia = Provincias, Año = Periodo, Total_d = Total)
Unión de datos de ingreso y muerte
df_combined <- left_join(x = df_i, y = df_m, by = c("Provincia", "Año", "Comunidad.Autonoma", "Sexo"))
Unión de todos los datos de diabetes (en df_combined) y datos meteorológicos.
df_combined <- left_join(x = df_combined, y = datos_met, by = c("Provincia", "Año"))
Resultado final.
datatable(df_combined)
En la aplicación shiny además de estos dos primeros gráficos, encontraremos muchos más ejemplos.
datos_filtrados <- df_combined %>%
filter(Año >= 2010 & Sexo == "Ambos sexos")
p <- ggplot(datos_filtrados, aes_string(x = "Año", y = "Diagnosticos", color = "Comunidad.Autonoma",
group = "Comunidad.Autonoma", text = "paste('Provincia:', Provincia)"
)) +
geom_point() +
geom_smooth(method = "lm", aes(color = Comunidad.Autonoma), se = FALSE ) +
labs(title = paste("Diagnosticos", "(cada 100.000 hab) por año y provincia (Sexo:", "Ambos sexos", ")"),
x = "Año", y = "Diagnosticos") +
theme_minimal()
ggplotly(p)
print(p)
datos_filtrados_temp <- df_combined %>%
filter(Sexo == "Ambos sexos" & !is.na(tm_mes) & Año >= 2010)
p2 <- ggplot(datos_filtrados_temp, aes_string(
x = "tm_mes",
y = "Diagnosticos",
color = "Comunidad.Autonoma",
text = "paste('Provincia:', Provincia, '<br>Año:', Año)"
)) +
geom_point(alpha = 0.6) +
geom_smooth(
method = "lm",
se = TRUE,
aes_string(x = "tm_mes", y = "Diagnosticos"),
inherit.aes = FALSE,
color = "black"
) +
labs(title = paste("Relación entre", "Diagnosticos", "y","tm_mes", "(cada 100.000 hab) (Sexo:", "Ambos sexos", ")"),
x = "tm_mes", y = "Número de:Diagnosticos") +
theme_minimal()
ggplotly(p2)
print(p2)
En este apartado encontraremos las dos partes que conforman la aplicación shiny.
En este apartado nos encontramos con la parte interactiva de la aplicación donde podremos elegir el gráfico que queremos mostrar. Hay un total de 4 opciones, 3 de ellas son gráficos de dispersión y un mapa de España.
En cada caso podremos selecionar diferentes variables a mostrar mediante una caja de opciones o una casilla de selección.
Primer gráfico: Podremos mostrar el sexo, diagnósticos de ingreso o muertes, si se deasea mostrar los datos desde el año 2010 y si se quieren mostrar o no los límites de intervalo de confianza.
Segundo gráfico: Podremos mostrar el sexo que queramos, diagnosticos de ingreso o muertes, la temperatura maxima, minima o media, si se deasea mostrar los datos desde el año 2010 y si se quieren mostrar o no los limites de intervalo de confianza.
Tercer gráfico: Podremos mostar la provincia en concreto que deseemos, la variable que queremos a lo largo de los años o temperaturas, diagnosticos o muertes, si se deasea mostrar los datos desde el año 2010 y si se quieren mostrar o no los limites de intervalo de confianza.
Mapa de España: En este mapa podremos seleccionar entre el sexo que queremos mostrar y el año que se desea mostrar, ademas de ser interactivo, donde se mostrara la temperatura media de la provincia y los casos.
library(shiny)
library(ggplot2)
library(plotly)
# Interfaz de usuario
ui <- fluidPage(
titlePanel("Selecciona y visualiza gráficos"),
sidebarLayout(
sidebarPanel(
selectInput("graph_choice", "Seleccione el gráfico a mostrar:",
choices = c("Casos/Muertes (100.000 hab) por año y provincia" = "grafico1",
"Temperatura vs número de casos/Muertes (100.000 hab)" = "grafico2",
"Casos/Muertes (100.000 hab) de una provincia en Concreto (En años y en temperaturas)" = "grafico3",
"Mapa de España Casos (100.000 hab) en un año" = "grafico4"
)),
# Controles para el primer gráfico
conditionalPanel(
condition = "input.graph_choice == 'grafico1'",
div(
style = "width: 150px;",
selectInput("sex", "Seleccione el sexo:", choices = NULL),
selectInput("valor", "Seleccione el Diagnosticos/muertes:", choices = c("Diagnosticos", "Muertes")),
checkboxInput("filtro_año", "Mostrar datos desde 2010", value = FALSE),
checkboxInput("Limites", "Mostrar intervalo de confianza", value = FALSE)
)
),
# Controles para el segundo gráfico
conditionalPanel(
condition = "input.graph_choice == 'grafico2'",
div(
selectInput("temp_var", "Seleccione la variable de temperatura:",
choices = c("ta_max", "ta_min", "tm_mes")),
selectInput("sex_temp", "Seleccione el sexo:", choices = NULL),
selectInput("valor_temp", "Seleccione el Diagnosticos/muertes:", choices = c("Diagnosticos", "Muertes")),
checkboxInput("filtro_año_temp", "Mostrar datos desde 2010", value = FALSE),
checkboxInput("Limites_temp", "Mostrar intervalo de confianza", value = FALSE)
)
),
#Controles del tercer grafico
conditionalPanel(
condition = "input.graph_choice == 'grafico3'",
div(
style = "width: 150px;",
selectInput("provincia_1", "Seleccione la provincia:", choices = NULL),
selectInput("selecion_1", "Seleccione la variable del eje de las X (Años, o temperaturas):",
choices = c("Año","ta_max", "ta_min", "tm_mes")),
selectInput("sex_1", "Seleccione el sexo:", choices = NULL),
selectInput("valor_1", "Seleccione el Diagnosticos/muertes:", choices = c("Diagnosticos", "Muertes")),
checkboxInput("filtro_año_1", "Mostrar datos desde 2010", value = FALSE),
checkboxInput("Limites_1", "Mostrar intervalo de confianza", value = FALSE)
)
),
#Controles del mapa de España
conditionalPanel(
condition = "input.graph_choice == 'grafico4'",
div(
selectInput("sex_map", "Seleccione el sexo:", choices = NULL),
selectInput("año_map", "Selecione el año a mostrar", choices = NULL)
)
),
),
mainPanel(
conditionalPanel(
condition = "input.graph_choice == 'grafico1'",
plotlyOutput("scatterPlot1", width = "100%", height = "700px")
),
conditionalPanel(
condition = "input.graph_choice == 'grafico2'",
plotlyOutput("scatterPlot2", width = "100%", height = "700px")
),
conditionalPanel(
condition = "input.graph_choice == 'grafico3'",
plotlyOutput("scatterPlot3", width = "100%", height = "700px")
),
conditionalPanel(
condition = "input.graph_choice == 'grafico4'",
plotlyOutput("scatterPlot4", width = "100%", height = "700px")
)
)
)
)
En esta otra sección nos encontramos con la parte que se ejecuta para poder mostrar los gráficos finales.
En este apartado, se rellenan las selecciones de la interfaz gráfica, como el sexo, las provincias, años.
Igualmente, dependiendo de lo que seleccionemos para mostrar en la interfaz, se ejecutará una gráfica u otra.
En todos los graficos primeramente filtraremos los datos a los seleccionados por el usuario, para poder mostrarlo. Posteriormente, pasaremos a mostrar los diferentes gráficos según la selección tomada. Y por último, se convertirán en gráficos interactivo, para una mejor visualización donde poder consultar los valores que toman y poder seleecionar y deseleccionar diversas opciones.
server <- function(input, output, session) {
# Actualiza las opciones de sexo basadas en los datos cargados
observe({
updateSelectInput(session, "sex", choices = unique(df_combined$Sexo))
updateSelectInput(session, "sex_temp", choices = unique(df_combined$Sexo))
updateSelectInput(session, "sex_1", choices = unique(df_combined$Sexo))
updateSelectInput(session, "provincia_1", choices = unique(df_combined$Provincia))
updateSelectInput(session, "sex_map", choices = unique(provincias_sf$Sexo))
updateSelectInput(session, "año_map", choices = unique(provincias_sf$Año))
})
# Renderiza el primer gráfico de dispersión
output$scatterPlot1 <- renderPlotly({
req(input$graph_choice == "grafico1")
datos_filtrados <- df_combined %>%
filter(Sexo == input$sex)
if (input$filtro_año) {
datos_filtrados <- datos_filtrados %>%
filter(Año >= 2010)
}
p <- ggplot(datos_filtrados, aes_string(x = "Año", y = input$valor, color = "Comunidad.Autonoma",
group = "Comunidad.Autonoma", text = "paste('Provincia:', Provincia)"
)) +
geom_point() +
geom_smooth(method = "lm", aes(color = Comunidad.Autonoma), se = input$Limites ) +
labs(title = paste(input$valor, "(cada 100.000 hab) por año y provincia (Sexo:", input$sex, ")"),
x = "Año", y = input$valor) +
theme_minimal()
ggplotly(p)
})
# Renderiza el segundo gráfico de dispersión
output$scatterPlot2 <- renderPlotly({
req(input$graph_choice == "grafico2")
datos_filtrados_temp <- df_combined %>%
filter(Sexo == input$sex_temp)
if (input$filtro_año_temp) {
datos_filtrados_temp <- datos_filtrados_temp %>%
filter(Año >= 2010)
}
p2 <- ggplot(datos_filtrados_temp, aes_string(
x = input$temp_var,
y = input$valor_temp,
color = "Comunidad.Autonoma",
text = "paste('Provincia:', Provincia, '<br>Año:', Año)"
)) +
geom_point(alpha = 0.6) +
geom_smooth(
method = "lm",
se = input$Limites_temp,
aes_string(x = input$temp_var, y = input$valor_temp),
inherit.aes = FALSE,
color = "black"
) +
labs(title = paste("Relación entre", input$temp_var, "y",input$valor_temp, "(cada 100.000 hab) (Sexo:", input$sex, ")"),
x = input$temp_var, y = input$valor_temp) +
theme_minimal()
ggplotly(p2)
})
output$scatterPlot3 <- renderPlotly({
req(input$graph_choice == "grafico3")
datos_filtrados_prov <- df_combined %>%
filter(Sexo == input$sex_1 & Provincia == input$provincia_1)
if (input$filtro_año_1) {
datos_filtrados_prov<- datos_filtrados_prov %>%
filter(Año >= 2010)
}
p3 <- ggplot(datos_filtrados_prov, aes_string(x = input$selecion_1,
y = input$valor_1,
color = "Comunidad.Autonoma",
text = "paste('Provincia:', Provincia)"
)) +
geom_point()+
geom_smooth(method = "lm", aes(color = input$provincia_1), se = input$Limites_1 )+
labs(title = paste(input$valor_1, "(cada 100.000 hab) por", input$selecion_1, "y provincia",input$provincia_1, "(Sexo:", input$sex_1, ")"),
x = input$selecion_1, y = input$valor_1) +
theme_minimal()
ggplotly(p3)
})
output$scatterPlot4 <- renderPlotly({
req(input$graph_choice == "grafico4")
datos_filtrados_map <- provincias_sf %>%
filter(Año == input$año_map & !is.na(ta_max) & Sexo == input$sex_map)
interactive_map <- ggplot(datos_filtrados_map) +
geom_sf(aes(fill = Diagnosticos, text = paste0(
"Provincia: ", Provincia, "<br>",
"Diagnósticos: ", Diagnosticos, "<br>",
"Temp. Media: ", round(tm_mes, 1)
)), color = "grey70", linewidth = 0.3) + # Incluye información adicional en el hover
geom_sf(data = can, color = "grey70") + # Ajustar Canarias
scale_fill_gradientn(
colors = hcl.colors(10, "Reds", rev = TRUE), # Escala de colores para diagnósticos
n.breaks = 10,
guide = guide_colorbar(title = "Diagnósticos")
) +
labs(title = "Diagnósticos por provincia y temperatura media",
fill = "Diagnósticos") +
theme_void() +
theme(legend.position = "right")
# Usa plotly para interactividad
ggplotly(interactive_map, tooltip = "text")
})
}
Como se observara en algunos de los graficos se empleara aes_string, esto se debe a como estan formulado la seleccion de opciones en la interfaz, de hay la razon por la que exista algunos graficos con aes y otros con aes_string. En lugar de emplear aes_string se podria emplear (!!sym) que es otra forma de implementar las variables mucho mas moderna, pero parecio una forma de complicar las cosas. Se tendria que tomar esto en cuenta ya que en algunas de las ejecuciones se mostraba como que aes_string es una forma poco moderna.
El análisis de los datos ha presentado una dificultad añadida debido